package com.xzq.erp.utils;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;

public class DateUtils {

    /**
     * 获取当天的开始时间 (00:00:00)
     */
    public static LocalDateTime getTodayStart() {
        return LocalDate.now().atStartOfDay();
    }

    /**
     * 获取当天的结束时间 (23:59:59.999999999)
     */
    public static LocalDateTime getTodayEnd() {
        return LocalDate.now().atTime(LocalTime.MAX);
    }

    /**
     * 获取本周的开始时间 (周一 00:00:00)
     */
    public static LocalDateTime getWeekStart() {
        return LocalDate.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).atStartOfDay();
    }

    /**
     * 获取本周的结束时间 (周日 23:59:59.999999999)
     */
    public static LocalDateTime getWeekEnd() {
        return LocalDate.now().with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)).atTime(LocalTime.MAX);
    }

    /**
     * 获取上周的开始时间（周一 00:00:00）
     */
    public static LocalDateTime getLastWeekStart() {
        return LocalDate.now()
                .minusWeeks(1)
                .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY))
                .atStartOfDay();
    }

    /**
     * 获取上周的结束时间（周日 23:59:59.999999999）
     */
    public static LocalDateTime getLastWeekEnd() {
        return getLastWeekStart().plusDays(6).with(LocalTime.MAX);
    }

    /**
     * 获取指定日期所在周的上周开始时间
     */
    public static LocalDateTime getLastWeekStart(LocalDate date) {
        return date.minusWeeks(1)
                .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY))
                .atStartOfDay();
    }

    /**
     * 获取指定日期所在周的上周结束时间
     */
    public static LocalDateTime getLastWeekEnd(LocalDate date) {
        return getLastWeekStart(date).plusDays(6).with(LocalTime.MAX);
    }

    /**
     * 获取指定日期所在周的开始时间
     */
    public static LocalDateTime getWeekStart(LocalDate date) {
        return date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).atStartOfDay();
    }

    /**
     * 获取指定日期所在周的结束时间
     */
    public static LocalDateTime getWeekEnd(LocalDate date) {
        return date.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)).atTime(LocalTime.MAX);
    }

    /**
     * 格式化时间（默认格式：yyyy-MM-dd HH:mm:ss）
     */
    public static String format(LocalDateTime time) {
        return time.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    /**
     * 格式化时间（自定义格式）
     */
    public static String format(LocalDateTime time, String pattern) {
        return time.format(DateTimeFormatter.ofPattern(pattern));
    }
}
